// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file contains the implementation shared by
// TaskRunner::PostTaskAndReply and WorkerPool::PostTaskAndReply.

#ifndef BASE_THREADING_POST_TASK_AND_REPLY_IMPL_H_
#define BASE_THREADING_POST_TASK_AND_REPLY_IMPL_H_

#include "base/callback_forward.h"
#include "base/location.h"

namespace base {
namespace internal {

    // Inherit from this in a class that implements PostTask appropriately
    // for sending to a destination thread.
    //
    // Note that 'reply' will always get posted back to your current
    // MessageLoop.
    //
    // If you're looking for a concrete implementation of
    // PostTaskAndReply, you probably want base::SingleThreadTaskRunner, or you
    // may want base::WorkerPool.
    class PostTaskAndReplyImpl {
    public:
        virtual ~PostTaskAndReplyImpl() = default;

        // Implementation for TaskRunner::PostTaskAndReply and
        // WorkerPool::PostTaskAndReply.
        bool PostTaskAndReply(const tracked_objects::Location& from_here,
            const Closure& task,
            const Closure& reply);

    private:
        virtual bool PostTask(const tracked_objects::Location& from_here,
            const Closure& task)
            = 0;
    };

} // namespace internal
} // namespace base

#endif // BASE_THREADING_POST_TASK_AND_REPLY_IMPL_H_
